package com.base.cn.platform.os.common.utils.file;

import com.base.cn.platform.os.common.md5.MD5;
import com.base.cn.platform.os.common.utils.BaseUtil;
import com.base.cn.platform.os.common.utils.DateUtils;
import com.base.cn.platform.os.common.utils.StringUtils;
import com.base.cn.platform.os.common.utils.file.image.PictureTool;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 上传图片工具类
 *
 * @author s.li
 * @create 2017-04-20-19:14
 */
public class FileUtil extends BaseUtil{
    public static String DIR_NAME="/upload";
    /**
     * 保存文件
     *
     * @param request       HttpServletRequest
     * @param rootDir 文件只在根目录
     * @param staticPath 静态域名
     * @param multipartFile MultipartFile
     * @return Map<String,String> 包含文件物理路径和不包含域名IP的访问路径
     */
    public static Map<String,String> saveFile(HttpServletRequest request,String rootDir,String staticPath, MultipartFile multipartFile) throws Exception {
        Map<String,String> fileMap = getSaveDir(request,rootDir,staticPath,multipartFile);
        String savePath = fileMap.get("savePath");
        File file = new File(savePath);
        file.setExecutable(true);
        file.setReadable(true);
        multipartFile.transferTo(file);
        //获取文件名
        fileMap.put("fileName",multipartFile.getOriginalFilename());
        fileMap.put("createTime",DateUtils.format(new Date(),"yyyy-MM-dd"));
        return fileMap;
    }

    /**
     * 保存路径
     * @param request HttpServletRequest
     * @param rootDir 文件只在根目录
     * @param staticPath 静态域名
     * @param multipartFile 文件对象
     * @param cutData 剪切数据（只对图片类型的文件走作用）
     * @return  Map<String,Object>
     * @throws Exception
     */
    public static Map<String,Object> saveFile(HttpServletRequest request,String rootDir,String staticPath,MultipartFile multipartFile,Map<String,Object> cutData) throws Exception{
        Map<String,String> fileMap = saveFile(request,rootDir,staticPath,multipartFile);
        String filePath = fileMap.get("savePath");
        Map<String,Object> resultMap = PictureTool.cutFixedScaleImage(filePath,rootDir,staticPath,cutData);
        //获取文件名
        resultMap.put("fileName",multipartFile.getOriginalFilename());
        resultMap.put("createTime",DateUtils.format(new Date(),"yyyy-MM-dd"));
        return resultMap;
    }

    /**
     * 获取文件保存路径
     * @param request
     * @param rootDir
     * @param staticPath
     * @param multipartFile
     * @return
     */
    public static Map<String,String> getSaveDir(HttpServletRequest request,String rootDir,String staticPath,MultipartFile multipartFile){
        String tenantId = request.getParameter("tenantId");
        //文件名
        String fileName = multipartFile.getOriginalFilename();
        String suffix = getFileFormat(fileName);//文件后缀
        Map<String ,String> map =new HashMap<>();
        if (suffix.equals(".apk")){//app上传路径
            String url = staticPath + "/download/app/an/"+fileName;
            String path = rootDir+ "/download/app/an/"+fileName;
            if(!new File(path).getParentFile().exists()){
                new File(path).getParentFile().mkdirs();
            }
            map.put("url",url);
            map.put("savePath",path);
        }else{
            if(StringUtils.isEmpty(tenantId)){
                tenantId = "0";
            }
            String base = request.getParameter("base");
            if (StringUtils.isEmpty(base)) {
                base = "yzl";
            }
            String param = request.getParameter("param");
            if (StringUtils.isEmpty(param)) {
                param = "common";
            }
            //获取当前时间
            String yyyyMMdd = DateUtils.format(new Date(),"yyyyMMddHH");
            String name = MD5.getMD5(System.currentTimeMillis()+StringUtils.getRandStr(32)+fileName);
            String path = rootDir+ DIR_NAME +"/"+tenantId+"/"+base +"/"+ param+ "/" + yyyyMMdd +"/" + name+ suffix;
            //如果目录不存在 ，则创建目录
            if(!new File(path).getParentFile().exists()){
                new File(path).getParentFile().mkdirs();
            }
            String url = staticPath + DIR_NAME +"/" +tenantId+"/"+base +"/"+ param+ "/" + yyyyMMdd +"/"+name+ suffix;
            map.put("url",url);
            map.put("savePath",path);
        }
        return map;
    }

    /**
     * 获取文件后缀
     * @param fileName 名称
     * @return 文件后缀
     */
    public static String getFileFormat(String fileName){
        if(StringUtils.isNotEmpty(fileName)){
            int len = fileName.lastIndexOf(".")+1;
            return "."+fileName.substring(len,fileName.trim().length());
        }
        return null;
    }

}
